package org.epsi.blokus.tools;

import org.newdawn.slick.SlickException;


/**
 * Gestion des cases et des coordonnées
 * @author julien.lafont
 */
public class CaseUtil {

    /**
     * Transforme des coordonnées du tableau (col/lig) en coordonnées à l'écran (x/y)
     * @param col
     * @param lig
     * @return
     */
    public static Point caseToCoord(int col, int lig)
    {
        Point v = new Point();
        v.setY(Math.round(61+lig*45.2f));
        v.setX(Math.round(100+lig*26.2f + col*52.4f));
        return v;
    }


    /**
     * Transforme une coordonnée (X,Y) en position dans le tableau (Lig,Col)
     * En l'absence de formule mathématique, on passe par un algo
     * @param x
     * @param y
     * @return
     */
    public static Point coordToCase(float x, float y) throws SlickException
    {
        Point v = new Point(-1, -1);

        int col=0; int lig=0;
        for(col=-1; col<11; col++)
        {
            for (lig=0; lig<11+1; lig++)
            {
                Point coordDebut = caseToCoord(col, lig);
                Point coordFinDroite = caseToCoord(col+1, lig);
                Point coordFinBas = caseToCoord(col, lig+1);

                // Si on est dans le rectangle de la case
                if (x>coordDebut.getX() && x<coordFinDroite.getX() && y>coordDebut.getY() && y<coordFinBas.getY())
                {
                    // Si le click est dans le tiers supérieur, on va vérifier si il l'est dans un des triangles n'appartenant pas à la case
                    if (y<coordDebut.getY()+15)
                    {
                        // Clic dans le carré supérieur gauche ?
                        if (x<coordDebut.getX() + 26.2)
                        {
                            // Clic dans le triangle supérieure gauche ( qui appartient à une autre case ) ?
                            if ( y < (coordDebut.getY() + 22.6 - (x -  coordDebut.getX())))
                            {
                                lig--;
                            }
                        }

                        // Carré supérieur droit ?
                        else  {

                            // Clic dans le triangle supérieure droite ( qui appartient à une autre case ) ?
                            if ( y < (coordDebut.getY() + (x -  (coordDebut.getX()+26.2))))
                            {
                                lig--;
                                col++;
                            }
                        }
                    }

                    // Bordures
                    if (col<0) col=0;
                    if (col>10) col=10;
                    if (lig<0) lig=0;
                    if (lig>10) lig=10;

                    v.setX(col);
                    v.setY(lig);

                    return v;
                }
            }
        }

        throw new SlickException("Case incorrecte");
    }
    
}
